package com.kaifamiao.creation;

import java.util.UUID;
import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask;
import java.util.concurrent.RunnableFuture;

/**
 * 1、通过实现 Callable 接口完成需要在线程体中实现的操作
 * 2、RunnableFuture 接口 同时继承了 Runnable 接口 和 Future 接口
 * 3、FutureTask类 实现了 RunnableFuture 接口
 * 4、通过 Future 接口提供的支持可以获得由 callable.call() 所返回的结果
 */
public class Third {

    public static void main(String[] args) throws Exception {

        // 用匿名类实现接口
        Callable<String> callable = new Callable<String>() {
            @Override
            public String call() throws Exception {
                Thread t = Thread.currentThread();
                System.out.println( "我是" + t.getName() );
                return UUID.randomUUID().toString();
            }
        };

        // RunnableFuture 接口继承了 Runnable 接口
        RunnableFuture rf = new FutureTask( callable );

        Thread t = new Thread( rf, "线程鸡" );
        t.start(); // t.start() --> t.run() --> rf.run() ---> callable.call()

        System.out.println( "is done: " + rf.isDone() );

        while ( true ) {
            if( rf.isDone() ) {
                System.out.println( Thread.currentThread().getName() );
                // 获得由 callable.call 所返回的结果
                Object result = rf.get();
                System.out.println( result );
                return;
            }
        }

    }

}
